#include <REGX52.H>
#include "Int0.h"
#include "Timer.h"

unsigned int IR_Time;
unsigned char IR_State;//0：待机 1：起始 2：解码 3：重发
unsigned char IR_Data[4];//存储32位数据
unsigned char IR_pData;//数据位置
unsigned char IR_DataFlag;//收到数据标志
unsigned char IR_RepeatFlag;//重复标志
unsigned char IR_Address;//地址码
unsigned char IR_Command;//控制码

/**
  * @brief  红外遥控初始化
  * @param  无
  * @retval 无
  */
void IR_Init()
{
	Timer0_Init();
	Int0_Init();//下降沿触发的中断	
}

/**
  * @brief  是否获取数据
  * @param  无
  * @retval 返回1表示已获取，0为未获取
  */
unsigned char IR_GetDataFlag()
{
	if(IR_DataFlag)
	{
		IR_DataFlag=0;
		return 1;
	}
	return 0;
}

/**
  * @brief  是否连按重发数据
  * @param  无
  * @retval 返回1表示重发，0为未重发
  */
unsigned char IR_GetRepeatFlag()
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag=0;
		return 1;
	}
	return 0;
}

/**
  * @brief  返回地址码
  * @param  无
  * @retval 地址码
  */
unsigned char IR_GetAddress()
{
	return IR_Address;
}
/**
  * @brief  返回命令码
  * @param  无
  * @retval 命令码
  */
unsigned char IR_GetCommand()
{
	return IR_Command;
}

void Int0_Routine()  interrupt 0
{
	if(IR_State==0)//0-待机状态 判断有无下降沿
	{
		Timer0_SetCounter(0);
		Timer0_Run(1);
		IR_State=1;
	}
	
	else if(IR_State==1)//1-起始状态 根据俩下降沿计时时间确定是Start或Repeat
	{
		IR_Time=Timer0_GetCounter();//记录下降沿时间
		Timer0_SetCounter(0);//重新计时
		if(IR_Time>12442-500 && IR_Time<12442+500)//开始Start状态
		{
			IR_State=2;//进入解码状态		
		}
		else if(IR_Time>10368-500 && IR_Time<10368+500)//3-开始Repeat状态
		{		
			IR_RepeatFlag=1;//进入重发状态
			IR_State=0;	//进入空闲状态
			Timer0_Run(0);			
		}
		else
		{
			IR_State=1;		
		}
	}
	
	else if(IR_State==2)//2-解码状态(由低到高)
	{
		IR_Time=Timer0_GetCounter();//记录下降沿时间
		Timer0_SetCounter(0);//重新计时	
		if(IR_Time>1032-600 && IR_Time<1032+500)//写入0
		{
			//IR_pData为32位数据，IR_Data[4]为4个八位数据
			IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));//指针位写入0
			IR_pData++;
		}		
		else if(IR_Time>2074-500 && IR_Time<2074+600)//写入1
		{
			IR_Data[IR_pData/8]|=0x01<<(IR_pData%8);//指针位写入1
			IR_pData++;
		}	
		else
		{
			IR_pData=0;
			IR_State=1;		//重新开始搜索开始数据			
		}
		if(IR_pData>=32)
		{
			IR_pData=0;
			if(IR_Data[0]==~IR_Data[1]&&IR_Data[2]==~IR_Data[3])
			{
				IR_Address=IR_Data[0];//地址码
				IR_Command=IR_Data[2];//控制码
				IR_DataFlag=1;//收到数据标志位
			}
			Timer0_Run(0);
			IR_State=0;//回到空闲状态
		}	
	}
	
}